package com.ljx.decoratorMode;

/**
 * 装饰器模式
 * 定义：
 * 指在不改变原有对象结构的基础情况下，动态地给该对象增加一些额外功能的职责。装饰器模式相比生成子类更加灵活。它属于对象结构型模式
 *
 * 使用场景：
 * 当需要给一个现有类添加附加职责，而又不能采用生成子类的方法进行扩充时。
 * 当对象的功能要求可以动态地添加，也可以再动态地被撤销时。
 * 当需要通过对现有的一组基本功能进行排列组合而产生非常多的功能时，采用继承关系很难实现，而采用装饰模式却很好实现
 *
 * 优点
 * 装饰器是继承的有力补充，比继承灵活，不改变原有对象的情况下动态地给一个对象扩展功能，即插即用
 * 通过使用不同装饰类以及这些装饰类的排列组合，可以实现不同效果
 * 装饰器完全遵守开闭原则
 * 缺点
 * 从代码层面来看，使用装饰器模式会出现更多的代码，更多的类，增加程序复杂性
 * 动态装饰时，多层装饰时会更复杂
 *
 * 经典应用：
 * JDK中的处理流 IO中包装流类等
 * Spring 中处理事务缓存的 TransactionAwareCacheDecorator类
 * Mybatis 中处理缓存设计的 Cache类等
 *
 * @作者 LJX
 * @日期 2022/12/21 10:43
 */
public class DecoratorTest {

    public static void main(String[] args) {
        BeautyDecorator beautyDecorator = new BeautyDecorator(new FilterDecorator(new ConcreteComponent()));
        beautyDecorator.operation();
    }

}

/**
 * 基础接口
 */
interface Component{
    /**
     * 基础功能
     */
    void operation();
}

/**
 * 基础实现类
 */
class ConcreteComponent implements Component{
    @Override
    public void operation() {
        System.out.println("基础拍照功能");
    }
}

/**
 * 装饰器
 */
abstract class Decorator implements Component{
    Component component;

    public Decorator(Component component) {
        this.component = component;
    }
}

/**
 * 滤镜装饰器
 */
class FilterDecorator extends Decorator{

    public FilterDecorator(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        System.out.println("附加功能：滤镜");
        component.operation();
    }
}

/**
 * 美颜装饰器
 */
class BeautyDecorator extends Decorator{

    public BeautyDecorator(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        System.out.println("附加功能：美颜");
        component.operation();
    }
}

